package reflect02;

import org.junit.Test;
import reflect01.Person;

import java.lang.reflect.Field;

/**
 * 反射(解剖出)字段
 * Class类中的成员方法:
 *    Field getField(String name)
 *           返回一个 Field 对象，它反映此 Class 对象所表示的类或接口的指定public修饰的成员字段。
 *     Field getDeclaredField(String name)
 *           返回一个 Field 对象，该对象反映此 Class 对象所表示的类或接口的指定已声明字段
 * Field类中的成员方法:
 *  Object get(Object obj)
 *           返回指定对象上此 Field 表示的字段的值。
 */
public class ReflectDemo02 {
	@Test
	public void testMethod01()throws Exception {
		//1.获取Person类的字节码对象
		Class<Person> pCls = (Class<Person>) Class.forName("reflect01.Person");

		//2.获取字段信息
		Field f = pCls.getField("name");
		//System.out.println(f);

		//3.获取该字段的值
		Person p = pCls.newInstance();//相当于:Person p=new Person();
		System.out.println(f.get(p));//由于成员变量随着对象的存在而存在,所以必须指定获取哪个对象的成员变量的值
	}

	@Test
	public void testMethod02()throws Exception {
		//1.获取Person类的字节码对象
		Class<Person> pCls = (Class<Person>) Class.forName("reflect01.Person");

		//2.利用getDeclaredField方法获取非public修饰的字段
		Field f = pCls.getDeclaredField("age");

		//4.通过setAccessiable设置java的访问权限检查
		f.setAccessible(true);

		//5.获取当前field字段的值
		Person p = pCls.newInstance();//相当于:Person p=new Person();
		System.out.println(f.get(p));

		//6.设置当前field字段的值
		f.set(p,28);

		//7.获取当前field字段的值
		System.out.println(f.get(p));

	}
}
